package cn.honqun.tinycms.common.json;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.date.format.FastDateFormat;
import cn.hutool.core.util.CharUtil;
import cn.hutool.core.util.ReUtil;
import cn.hutool.core.util.StrUtil;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * 支持标准时间正则，每个字段支持单个数字或2个数字，包括：
 * <pre>
 *     yyyy-MM-dd HH:mm:ss.SSSSSS
 *     yyyy-MM-dd HH:mm:ss.SSS
 *     yyyy-MM-dd HH:mm:ss
 *     yyyy-MM-dd HH:mm
 *     yyyy-MM-dd
 *     yyyy-MM-ddTHH:mm:ss
 * </pre>
 */
public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
    @Override
    public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext ctx) throws IOException {

        String dateStr = jsonParser.getValueAsString();
        if (ReUtil.isMatch(DatePattern.REGEX_NORM, dateStr)) {
            final int colonCount = StrUtil.count(dateStr, CharUtil.COLON);
            switch (colonCount) {
                case 0:
                    // yyyy-MM-dd
                    return LocalDateTimeUtil.parse(dateStr, DatePattern.NORM_DATE_FORMAT.getPattern());
                case 1:
                    // yyyy-MM-dd HH:mm
                    return LocalDateTimeUtil.parse(dateStr, DatePattern.NORM_DATETIME_MINUTE_FORMAT.getPattern());
                case 2:
                    final int indexOfDot = StrUtil.indexOf(dateStr, CharUtil.DOT);
                    if (indexOfDot > 0) {
                        final int length1 = dateStr.length();
                        // yyyy-MM-dd HH:mm:ss.SSS 或者 yyyy-MM-dd HH:mm:ss.SSSSSS
                        if (length1 - indexOfDot > 4) {
                            // 类似yyyy-MM-dd HH:mm:ss.SSSSSS，采取截断操作
                            dateStr = StrUtil.subPre(dateStr, indexOfDot + 4);
                        }
                        return LocalDateTimeUtil.parse(dateStr, DatePattern.NORM_DATETIME_MS_FORMAT.getPattern());
                    }
                    // yyyy-MM-dd HH:mm:ss
                    return LocalDateTimeUtil.parse(dateStr, DatePattern.NORM_DATETIME_FORMAT.getPattern());
            }
        }
        //缺省的ISO8601时间：yyyy-MM-dd'T'HH:mm:ss
        return LocalDateTimeUtil.parse(dateStr, DatePattern.UTC_SIMPLE_FORMAT.getPattern());
    }
}
